package com.resource.service;

import java.util.List;
import java.util.Map;

import com.resource.dto.ContractDetailDto;
import com.resource.dto.ContractImportDto;
import com.resource.dto.ContractSaveDto;
import com.resource.dto.ProjectImportDto;
import com.resource.query.ContractQuery;
import com.resource.query.ContractValidateQuery;
import com.resource.request.ContractArchiveRequest;
import com.resource.request.ContractSaveRequest;
import com.resource.response.ContractDetailResponse;
import com.resource.response.ContractPageItemResponse;
import com.resource.response.OfficePageWrapper;
import com.resource.utils.ServiceException;

import cn.hutool.json.JSONObject;

/**
 * 合同增删改查服务
 *
 * @author jianghao.zhang
 */
public interface ContractService {

	/**
	 * [分页查询]合同列表
	 *
	 * @param query
	 *            查询参数
	 * @return 分页列表
	 * @throws ServiceException
	 *             业务异常
	 */
	OfficePageWrapper<ContractPageItemResponse> queryPage(ContractQuery query) throws ServiceException;

	/**
	 * 根据id查询合同
	 *
	 * @param id
	 *            id
	 * @return 合同信息
	 * @throws ServiceException
	 *             业务异常
	 */
	ContractDetailResponse queryContractById(Integer id) throws ServiceException;

	ContractDetailDto queryContractDetailDtoById(Integer id);

	/**
	 * 添加合同
	 *
	 * @param request
	 *            请求参数
	 * @throws ServiceException
	 *             业务异常
	 */
	void addContract(ContractSaveRequest request) throws ServiceException;

	/**
	 * 修改合同
	 *
	 * @param request
	 *            请求参数
	 * @throws ServiceException
	 *             业务异常
	 */
	void updateContract(ContractSaveRequest request) throws ServiceException;

	/**
	 * 根据id删除合同
	 *
	 * @param id
	 *            id
	 * @throws ServiceException
	 *             业务异常
	 */
	void deleteContract(Integer id) throws ServiceException;

	/**
	 * 校验合同编号或合同标题是否重复
	 *
	 * @param query
	 *            校验参数
	 * @return true 是，false否
	 * @throws ServiceException
	 *             业务异常
	 */
	String validateRepeatedNumber(ContractValidateQuery query) throws ServiceException;

	/**
	 * 合同归档数据外发处理
	 *
	 * @param request
	 *            请求数据
	 */
	void updateContractArchive(ContractArchiveRequest request);

	/**
	 * 数据外发修改合同
	 * 
	 * @param contractSaveDto
	 */
	void updateContractBySend(ContractSaveDto contractSaveDto);

	/**
	 * 合同列表查询
	 * 
	 * @return
	 */
	List<JSONObject> listContractInfo(Map<String, List<Object>> condition);


	/**
	 * 导入项目
	 *
	 * @param dto
	 */
	void importContract(ContractImportDto dto);

}
